<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8" />
		<title>5.监视属性_深度监视</title>
		<!-- 引入Vue -->
		<script type="text/javascript" src="../js/vue.js"></script>
	</head>
	<body>
		<!-- 
				总结：
						1.如果想用深度监视，那么就必须把watch用完整形式去写。
								watch:{
									age:{
										//age的值变化，handler就会执行，且this是vm
										handler(){}
									}
								}
						2.watch默认不监测对象内部值的改变（监视一层，即：对象地址值）。
						3.追加配置deep:true，可以监测对象内部值改变（监视多层）。
						备注：使用watch时根据数据的具体结构，以及需求，决定是否采用深度监视。
		 -->
		<!-- 准备好一个容器-->
		<div id="demo">
			<ul>
				<li>姓名：{{name}}</li>
				<li>性别：{{sex}}</li>
				<li>年龄：对外{{age.foreignAge}} --- 真实{{age.realAge}}
				</li>
			</ul>
			<button @click="changeSex">修改性别</button>
			<button @click="changeForeignAge">对外年龄+1</button>
			<button @click="changeRealAge">真实年龄+1</button>
			<button @click="changeAge">彻底改掉强哥的age属性</button>
		</div>

		<script type="text/javascript">
			//阻止 vue 在启动时生成生产提示。
			Vue.config.productionTip = false
			
			new Vue({
				el:'#demo',
				data:{
					name:'强哥',
					sex:'女',
					age:{
						realAge:60,
						foreignAge:18,
					}
				},
				methods:{
					changeSex(){
						this.sex = '男'
					},
					changeForeignAge(){
						this.age.foreignAge += 1
					},
					changeRealAge(){
						this.age.realAge += 1
					},
					changeAge(){
						this.age = {
							realAge:3,
							foreignAge:4
						}
					}
				},
				watch:{
					/* sex(value){
						console.log('sex值变了',value)
					}, */

					//监视的是：对象中的某个指定属性
					/* 'age.foreignAge'(value){
						console.log('foreignAge值变了',value)
					}, */

					//监视的是：age对象，但不包含里面的属性 （地址值）
					/* age(){
						console.log('@@@@@@@')
					}, */

					//监视的是：age对象，且包含里面所有的属性
					age:{
						deep:true, //开启深度监视
						handler(){
							console.log('@@@@@')
						}
					}
				}
			})
		</script>
	</body>
</html>